import yunnanRegionCode from '../dict/yunnan_region_code.json';

// 地区Map缓存
let regionMap = new Map();
let regionArray = [];

/**
 * 初始化地区缓存
 */
const initRegionMap = () => {
    const buildRegionMap = (regions, parentPath = '') => {
        regions.forEach((region) => {
            const currentPath = parentPath ? `${parentPath}/${region.name}` : region.name;
            regionMap.set(region.code, {
                ...region,
                path: currentPath,
            });
            regionArray.push({
                ...region,
                path: currentPath,
            });
            if (region.children && region.children.length > 0) {
                buildRegionMap(region.children, currentPath);
            }
        });
    };

    buildRegionMap(yunnanRegionCode);
};

// 初始化缓存
initRegionMap();

/**
 * 根据地区代码获取地区名称
 * @param {string|number} code - 地区代码
 * @returns {string} 地区名称
 */
export const getRegionNameByCode = (code) => {
    if (!code) return '';
    const region = regionMap.get(Number(code));
    return region ? region.name : '';
};

/**
 * 根据地区代码获取地区完整路径
 * @param {string|number} code - 地区代码
 * @returns {string} 地区完整路径
 */
export const getRegionPathByCode = (code) => {
    if (!code) return '';
    const region = regionMap.get(Number(code));
    return region ? region.path : '';
};

/**
 * 获取所有市级地区
 * @returns {Array} 市级地区数组
 */
export const getCityRegions = () => {
    // 云南省内市级行政单位通常是以11结尾的代码
    // 或者查找parentId为云南省的地区
    const yunnanProvince = regionArray.find((item) => item.code.toString().endsWith('0000'));
    if (yunnanProvince && yunnanProvince.children) {
        return yunnanProvince.children;
    }

    // 备用方案：返回所有疑似市级的地区
    return regionArray.filter((item) => {
        const codeStr = item.code.toString();
        return codeStr.length === 6 && codeStr.endsWith('00');
    });
};

/**
 * 获取指定市下的区县
 * @param {string|number} cityCode - 市代码
 * @returns {Array} 区县数组
 */
export const getDistrictsByCity = (cityCode) => {
    const city = regionMap.get(Number(cityCode));
    return city && city.children ? city.children : [];
};

/**
 * 获取指定区县下的街道
 * @param {string|number} districtCode - 区县代码
 * @returns {Array} 街道数组
 */
export const getStreetsByDistrict = (districtCode) => {
    const district = regionMap.get(Number(districtCode));
    return district && district.children ? district.children : [];
};

/**
 * 将地区数据转换为级联选择器格式
 * @returns {Array} 级联选择器数据
 */
export const getRegionCascaderData = () => {
    const transformToCascader = (regions) => {
        return regions.map((region) => {
            const cascaderItem = {
                value: region.code,
                label: region.name,
            };
            if (region.children && region.children.length > 0) {
                cascaderItem.children = transformToCascader(region.children);
            }
            return cascaderItem;
        });
    };

    return transformToCascader(yunnanRegionCode);
};

/**
 * 批量转换地区代码为名称
 * @param {Array} codes - 地区代码数组
 * @returns {Array} 地区名称数组
 */
export const batchConvertRegionCodes = (codes) => {
    if (!Array.isArray(codes)) return [];
    return codes.map((code) => getRegionNameByCode(code));
};

/**
 * 获取地区完整对象
 * @param {string|number} code - 地区代码
 * @returns {Object} 地区对象
 */
export const getRegionByCode = (code) => {
    if (!code) return null;
    return regionMap.get(Number(code)) || null;
};

/**
 * 获取地区所属的顶级市级节点
 * @param {string|number} code - 地区代码
 * @returns {Object|null} 市级地区对象
 */
export const getTopCityByRegion = (code) => {
    if (!code) return null;
    const codeStr = String(code);
    // 提取市级代码（前4位+00）
    const cityCode = codeStr.length >= 4 ? Number(codeStr.substring(0, 4) + '00') : null;
    return cityCode ? getRegionByCode(cityCode) : null;
};

export default {
    getRegionNameByCode,
    getRegionPathByCode,
    getCityRegions,
    getDistrictsByCity,
    getStreetsByDistrict,
    getRegionCascaderData,
    batchConvertRegionCodes,
    getRegionByCode,
    getTopCityByRegion,
};
